Amazon OpenSearch Service と Amazon Security Lake の Zero-ETL 統合をやってみる

Amazon OpenSearch Service と Amazon Security Lake の Zero-ETL 統合をやってみる

Amazon OpenSearch Service と Amazon Security Lake の zero-ETL を試してみました。
Clock Icon2025.01.21

12/1 に Amazon OpenSearch Service と Amazon Security Lake の zero-ETL に関するアップデートがありました。

https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-opensearch-service-zero-etl-integration-security-lake/

概要については以下のブログをご参考ください。

https://dev.classmethod.jp/articles/amazon-opensearch-zeroetl-securitylake-ga/

Amazon Security Lake には、外部との統合に「データアクセス」と「クエリアクセス」の2種類の方法があり、外部のサードパーティから直接クエリを行う場合は、「クエリアクセス」を利用します。

https://docs.aws.amazon.com/ja_jp/security-lake/latest/userguide/subscriber-management.html

本記事では Amazon Security Lake の「クエリアクセス」を使って、Amazon OpenSearch Service との zero-ETLをやってみます。

また、下記のブログでは Amazon Security Lake と Amazon Athena の「クエリアクセス」が紹介されていますので併せてご覧いただければと思います。

https://dev.classmethod.jp/articles/amazon-security-lake-subscriber-query-access/

Security Lake と OpenSearch Service の zero-ETLを試す

事前にAWS Organizationsの有効化と、Security Lakeの委任管理者アカウントの設定を行った環境で試します。

Security Lakeの有効化

委任管理者アカウントで、Security Lakeの有効化を行います。
AWSソースの選択や、取得対象とするリージョン、アカウントを任意で指定、サービスロールを作成し、設定します。
(ロールアップリージョンや、ストレージクラスの選択も任意で設定します。)

Screenshot 2025-01-17 at 11.08.24.jpg

有効化したあとに、「要約」の画面で表示される「サービスリンクロールを有効化」をクリックしておきます。

image-1737375521890.png

さらにSecurity Lakeが管理するバケットをLake Formationに登録するかどうかを問われる画面が表示されますので、「バケットを登録」をクリックします。

image-1737375588979.png

サブスクライバーの設定

Security Lakeでサブスクライバーを作成します。
サブスライバー名と、Lake Formationを選択します。

Screenshot 2025-01-17 at 12.51.40.jpg

アカウントID には、OpenSearch Service を動かすアカウントIDを入れます。
外部IDは、ランダムな文字列等や任意の文字列で入力します。

image-1737376515219.png

RAM でリソース共有を受け入れる

サブスライバーの設定を行うと、委任管理者アカウント上のSecurity Lakeで利用されるLake Formationのテーブルが、ダイレクトクエリを行う側のアカウントで共有されます。
OpenSearch Service を動かすアカウントで、RAM (Resource Access Manager) にアクセスし、共有を受け入れます。

「自分と共有」の場所に、保留中のリソースが確認できるので、それを選択し共有を受け入れます。

image-1737377589247.png

「共有リソース」の部分を確認すると、カタログ(マスク部分は委任管理アカウントID)、データベース、Security Lakeで共有対象としたもの(今回はSecurity Lakeで取得しているログソース全て)のテーブルが共有されていることが分かります。

image-1737378289162.png

試しに、OpenSearch Serviceを動かすアカウント側のLake Formationからもリソースが共有されているか確認してみます。

テーブルは正しく共有されていそうです。

image-1737378888164.png

データベースを確認すると、何も表示がされず共有されていないように見えています。

image-1737379029509.png

OpenSearch Serviceからのダイレクトクエリでは、共有データベースへのアクセスが必要となります。上記の手順でサブスクライバーに必要なリソースの共有ができたと思い、OpenSearch Serviceの接続を行ったところ、共有データベースが参照できず、うまくいきませんでした。さらに個別で下記の手順で共有設定したところ、うまくいきましたので、続いて設定していきます。

追加でLake Formationから共有を行う

Security Lake 委任管理アカウントの方から、Lake Formationで個別にデータベースの共有を行います。

Lake Formation の 「Data Permissions」 の設定で、「Grant」を選択します。
(こちらの画面でもDatabaseの共有権限は付与されていないことが確認できました。RAMでは共有できていたように見えたのに何故だろう...)

image-1737379263097.png

External Accounts を選択し、共有先のアカウントを選択します。

image-1737379470917.png

Named Data Catalog resourcesを選択し、カタログと、共有するデータベースを選択します。

image-1737379577725.png

Describeの権限を付与します。

image-1737379673863.png

これで、データベースの共有ができたので、再び共有先のアカウント(OpenSearch Serviceを動かすアカウント)のRAMで共有を受け入れます。

image-1737379926044.png

その後、共有先アカウントのLake Formationでデータベースを確認すると、共有されていることが確認できました。

image-1737380060098.png

Lake Formationでリソースリンクの設定

共有されたLake Formationのデータベースは、共有された側のアカウントから直接リソースを参照することができません。
その代わりにリソースリンク経由で、共有元のリソースにアクセスできるようになります。

OpenSearch Serviceを動かすアカウントのLake Formationでデータベースを作成します。

image-1737381940350.png

リソースリンクを選択し、共有されたデータベースを選択します。(Shared Account はSecurity Lakeの委任管理アカウントになります。)

image-1737382141017.png

OpenSearch Service で zero-ETL 接続の設定

データ接続を設定します。

Screenshot 2025-01-20 at 23.10.22.jpg

セキュリティレイクを選択します。

Screenshot 2025-01-20 at 7.22.23.jpg

IAMロールの作成と、Glue databaseを選択します。このとき、データベースが選択できるようになっている必要がありますが、ここで表示がされない場合は、一度共有設定やリソースリンクの設定が正しいか見直します。

image-1737382518983.png

作成に少し時間がかかるので、待ちます。

OpenSearch Service Serverless からデータを直接クエリする

OpenSearch Service Serverlessのアプリケーションが作成され、コンソールに接続することができます。
ログを詳しく見るをクリックしてみます。

image-1737382729730.png

データを見てみます。

Screenshot 2025-01-20 at 23.20.43.jpg

Security Lakeのデータに直接アクセスして、クエリをかけることができます。

Screenshot 2025-01-20 at 7.25.52.jpg

クエリ言語とタイムフィールドを選択する画面が出てくるのですが、そのまま何か選択すると、現在の時刻から2時間前のデータを検索しようとします。

Screenshot 2025-01-20 at 7.26.06.jpg

AWSのログはUTCタイムで記録がされているので、勝手に入るwhereの検索条件と日本時間とでずれがあるので何も表示がされません。

image-1737383570422.png

一度、whereの条件を消して、上部のタイムピッカーで15分前までのデータなどで検索しなおすとデータが出力されていれば、クエリが返ってきます。
最初の条件では、どんなログでも表示されませんので注意が必要です。

image-1737383693621.png

CloudTrailのログのクエリ結果を見てみると、OCSFのフィールドに認識されてログが検索できていることが確認できます。
いくつかのデータフィールドで、ネスト構造のJSONが文字列として認識されていそうなので、取り扱いを少し考える必要がありそうです。

image-1737383855967.png

また、直接クエリで接続したデータに対してダッシュボード化することもできます。
テンプレートも用意されているので、さくっと作れるようです。

Screenshot 2025-01-20 at 7.28.27.jpg

VPC flow logs、WAF logs、CloudTrail logsのビルトインダッシュボードがつくれるようです。

Screenshot 2025-01-20 at 7.28.41.jpg

ただし、可視化した場合には、料金がだいぶかかりそうなのでこの点は注意が必要そうです。

Amazon OpenSearch Service のコストに関しては、基本的に下記ブログの S3 と OpenSearch Service の zero-ETL 統合と同じ考え方となりますので、ご参考いただければと思います。

https://dev.classmethod.jp/articles/amazon-opensearch-s3-zero-etl-integration-ga/

まとめ

Amazon OpenSearch Service と Amazon Security Lake の zero-ETL をやってみました。
データパイプラインをつくらずともすぐに分析ができ、かつOCSFで正規化されたデータとして扱うことができることを確認しました。
ただ、データの正規化によるログソースを横断した相関分析の実現という点においては、もう少しサービス側のアップデートが必要になってくるのかなと感じました。
今後のさらなるアップデートに期待です。

参考

Amazon Security Lake サブスクライバーのクエリアクセスの管理

AWS Lake Formation 共有データベースへのリソースリンク作成

Amazon OpenSearch Service の Amazon Security Lake とのダイレクトクエリ

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.